package water.com.DaoSupport.DbBase;

import java.util.List;
import java.util.Map;

/**
 * ORM数据库操作通用基础接口
 */
public interface WaterIDaoSupport<T,R> {

    /**
     * 单条数据查询, 根据model中不为空的值作为条件进行查询
     * @param model 表模型
     * @return 查询到数据并转换为实例对象返回
     */
    T selectOne(T model) throws Exception;

    /**
     *单条数据更新， 仅支持有值的字段更新
     * 例如表对象Users中存在
     * id;
     * uname;
     * code;
     * password;
     * 四个字段，如果我们传入的对象user中 uname = '牧之' ，code = '四郎' ，传入的条件为 id = '1' ,
     * 则执行此方法只会更新id = ‘1’ 数据中的uname字段和code字段
     * @param model 表模型
     * @param conditionsMap 更新条件
     * @return 返回指定结果
     */
    R updateOne(T model,Map<String,String> conditionsMap) throws Exception;

    /**
     * 单条数据更新（前提条件：此表存在主键且模型中主键存在值），主键名称配置化，配置在配置信息中
     * @param model 有主键字段的数据模型对象
     * @return 返回指定结果
     */
    R updateOne(T model) throws Exception;

    /**
     * 单条数据更新（支持置空，谨慎使用！！），根据传入模型中所有字段的值作为更新内容进行更新！！
     * @param model 表模型
     * @param conditionsMap 更新条件
     * @return 返回指定结果
     */
    R updateOneAllowNull(T model,Map<String,String> conditionsMap) throws Exception;

    /**
     *单条数据删除，根据传入对象的有值字段作为条件进行删除。
     * @param model 表模型
     * @return 返回指定结果
     */
    R deleteOne(T model) throws Exception;

    /**
     *单条数据插入
     * @param model 表模型
     * @return 返回指定结果
     */
    R insertOne(T model) throws Exception;

    /**
     *批量数据查询，根据传入模型的有值字段进行查询，然后将查询的结果保存在list中返回，它支持只查一条数据，当查出一条数据时，list的大小为1
     * @param model 表模型
     * @return 返回指定结果
     */
    List<T> selectList(T model) throws Exception;

    /**
     * 批量数据更新,支持置空，谨慎使用，应当在需要更新置空的情况下使用，注意表模型集合和更新条件集合大小一致，索引位置对应内容一一对应
     * @param tList 表模型链表集合
     * @param conditionList 更新条件
     * @param isAllowNull 是否支持置空，当传入false时，它的作用和updateList(List<T> tList,List<Map> conditionList)一样
     * @return 返回指定结果
     * @throws Exception
     */
    R updateList(List<T> tList,List<Map> conditionList,boolean isAllowNull) throws Exception;

    /**
     * 批量数据更新,不支持置空，注意表模型集合和更新条件集合大小一致，索引位置对应内容一一对应
     * @param tList 表模型链表集合
     * @param conditionList 更新条件集合
     * @return 返回指定结果
     */
    R  updateList(List<T> tList,List<Map> conditionList) throws Exception;

    /**
     *批量数据删除，根据list中的对象内容作为条件进行批量删除
     * @param tList 表模型链表集合
     * @return 返回指定结果
     */
    R deleteList(List<T> tList) throws Exception;

    /**
     *批量数据插入，根据list中的对象内容作为条件进行批量插入
     * @param tList 表模型链表集合
     * @return 返回指定结果
     */
    R insertList(List<T> tList) throws Exception;

}
